package xlog

import (
	"log"
	"log/slog"
)

var defaultLogger, _ = NewLogger(nil)

var defaultStdLogger, _ = StdLog("stderr", "", TextFormat)

func DefaultStdLog() *log.Logger {
	return defaultStdLogger
}

func StdLog(out, prefix, format string) (*log.Logger, error) {
	cfg := DefaultConfig()
	cfg.AddSource = false
	cfg.OutputPaths = []string{out}
	cfg.Format = format
	logger, err := NewLogger(cfg)
	if err != nil {
		return nil, err
	}
	return log.New(logger, prefix, log.LstdFlags|log.Lshortfile), nil
}

func Default() *slog.Logger {
	return defaultLogger.logger
}

func New(cfg *Config) (*slog.Logger, error) {
	logger, err := NewLogger(cfg)
	if err != nil {
		return nil, err
	}

	return logger.Logger(), nil
}

func NewJsonLogger(out string) (*slog.Logger, error) {
	cfg := DefaultConfig()
	cfg.OutputPaths = []string{out}
	cfg.Format = JsonFormat
	logger, err := NewLogger(cfg)
	if err != nil {
		return nil, err
	}

	return logger.Logger(), nil
}

func NewTextLogger(out string) (*slog.Logger, error) {
	cfg := DefaultConfig()
	cfg.OutputPaths = []string{out}
	cfg.Format = TextFormat
	logger, err := NewLogger(cfg)
	if err != nil {
		return nil, err
	}

	return logger.Logger(), nil
}

func init() {
	log.SetFlags(log.LstdFlags | log.Lshortfile)
}
